<?php 

Yii::import('application.core.buscar_registro.Buscar_Usuario');
Yii::import('application.core.buscar_registro.Buscar_Empleado');
Yii::import('application.core.buscar_registro.Buscar_UserPc');
Yii::import('application.core.buscar_registro.Buscar_Sucursal');

Yii::import('application.core.nuevo_registro.Asignar_Pedido');
Yii::import('application.core.nuevo_registro.NuevoUsuario');
Yii::import('application.core.nuevo_registro.NuevoEmpleado');
Yii::import('application.core.nuevo_registro.NuevoUserPc');
Yii::import('application.core.nuevo_registro.NuevaSucursal');

Yii::import('application.core.modificar_registro.Modificar_Pedido');
Yii::import('application.core.modificar_registro.Modificar_Empleado');
Yii::import('application.core.modificar_registro.Modificar_Usuario');
Yii::import('application.core.modificar_registro.Modificar_UserPc');
Yii::import('application.core.modificar_registro.Modificar_Sucursal');

Yii::import('application.core.eliminar_registro.Eliminar_Pedido');
Yii::import('application.core.eliminar_registro.EliminarUsuario');
Yii::import('application.core.eliminar_registro.EliminarEmpleado');
Yii::import('application.core.eliminar_registro.EliminarUserPc');
Yii::import('application.core.eliminar_registro.Eliminar_Sucursal');

Yii::import('application.core.dbObject.Usuario');
Yii::import('application.core.dbObject.Empleado');
Yii::import('application.core.dbObject.UserPc');
Yii::import('application.core.dbObject.Pedido');
Yii::import('application.core.dbObject.Sucursal');

Yii::import('application.core.Configuracion_sucursal');
Yii::import('application.core.control_estadistico.Calcular_Pedidos');
Yii::import('application.core.control_estadistico.Pedidos_Por_Estado');
Yii::import('application.core.control_estadistico.Registro_De_Logs');

//Management System Facade

class SGF{
  
  //	private $Calendario;
  	private $config;
 	private $fecha_actual;
	private $usuario;
	private $empleado;
	private $empleados; //Array de empleados
	private $userPc;
	private $pedido;
	private $sucursal;
	private $especialidadDemo;

// 	private $especialidadDemo;
	
	private $gestionAsignarPedido;
	private $gestionModificarPedido;
	private $gestionEliminarPedido;

	private $gestionUsuario;
	private $gestionEmpleado;
	private $gestionUserPc;
	private $gestionSucursal;

	
//_______________________BUSQUEDA DE DATOS COMUNES______________________
// 	En esta etapa se busca y devuelve toda la informacion que sea comun a cualquier proceso:
// 	- La informacion completa del usuario que solicito el pedido.
	
	public function __construct($sucursal, $nro_userPc){ //id_sucursal
		(strlen($sucursal)&&strlen($nro_userPc)) ? 		
		$this->config= new Configuracion_sucursal($sucursal, $nro_userPc): false;
	}
	
	public function get_fecha_actual(){
		return $this->config->get_fecha_actual();
	}
	
	public function get_especialidades(){
		return $this->config->get_especialidades();
	}
	public function get_idsucursal(){
		return $this->config->get_id_sucursal();
	}

	public function get_usuario(){
		return $this->usuario;
	}
	
	public function nueva_config($sucursal, $direccion, $radio_de_accion, $nuevaEspecialidad){
		(strlen($sucursal)&& strlen($radio_de_accion) && strlen($direccion)<=200 && strlen($nuevaEspecialidad)<=40) ?
		$this->config->nueva_config($radio_de_accion, $nuevaEspecialidad): false;
	}
	
	public function get_empleado(){
		return $this->empleado;
	}
	
	public function get_userPc(){
		return $this->userPc;
	}
	
	public function get_sucursal(){
		return $this->sucursal;
	}
	
	public function get_empleados_disponibles(){ 
		return $this->empleados;
	}
	
	public function get_pedido(){
		return $this->pedido;
	}

	
	//___BUSQUEDA DE USUARIO___
	public function buscar_usuario($id_busqueda, $tipo_de_dato){
		if (strlen($id_busqueda)&&strlen($tipo_de_dato)<=20){
			$busqueda= new Buscar_Usuario($id_busqueda, $tipo_de_dato);
			$this->usuario =$busqueda->get_usuario_encontrado();
			return isset($this->usuario);
		}else {
			return false;
		}
	}	
	
	//___BUSQUEDA DE EMPLEADO___
	public function buscar_empleado($id_busqueda, $tipo_de_dato){
		if (strlen($id_busqueda)&&strlen($tipo_de_dato)<=20){
			$busqueda=new Buscar_Empleado($id_busqueda, $tipo_de_dato);
			$this->empleado= $busqueda->get_empleado_encontrado();
			return isset($this->empleado);
		}else {
			return false;
		}
	}
	
	//___BUSQUEDA DE UserPC___
	public function buscar_userPc($id_busqueda, $tipo_de_dato){
		if (strlen($id_busqueda)&&strlen($tipo_de_dato)<=20){
			$busqueda=new Buscar_UserPc($id_busqueda, $tipo_de_dato);
			$this->userPc= $busqueda->get_userPc_encontrado();
			return isset($this->userPc);
		}else {
			return false;
		}
	}
	
	//___BUSQUEDA DE PEDIDO___
	///solo buscar el ultimo pedido de un usuario o un pedido por nro_pedido
	//la hora puede ser null
	public function buscar_pedido($id_busqueda, $tipo_de_dato, $fecha_pedido, $hora_pedido){ // [nro_pedido, nro_usuario, dni_usuario]
		if (strlen($id_busqueda)&&strlen($tipo_de_dato)<=20 && strlen($fecha_pedido)<=10 && strlen($hora_pedido)<=5){
			$busqueda=new Buscar_pedido($id_busqueda, $tipo_de_dato, $fecha_pedido, $hora_pedido);
			$this->pedido= $busqueda->get_pedido_encontrado();
			$this->usuario= $busqueda->get_usuario_encontrado();
		}else {
			return false;
		}
	}
	
	
	//_____________________NUEVO PEDIDO_____________________________________
	
	//Requiere haber buscado al usuario correspondiente previamente. 
	
	//___PRIMERA ETAPA DE NUEVO PEDIDO___
		//realiza la busqueda de empleados para asignar el pedido y los guarda como array de empleados. 
		//Se debe indicar la sucursal en la cual se quiere realizar el pedido
	public function nuevoPedido($fecha_pedido,$hora_pedido, $especialidad, $prioridad,$otraSucursal)	
	{
		if (strlen($especialidad)<=20 && strlen($prioridad)<=10 && strlen($hora_pedido)<=5 && strlen($fecha_pedido)<=10){
			if($otraSucursal==$this->get_idsucursal()){
				$this->gestionAsignarPedido=new Asignar_Pedido($this->usuario, $fecha_pedido, $hora_pedido, $especialidad, $prioridad, $this->config,0);
				$this->empleados=$this->gestionAsignarPedido->get_lista_empleados();
			}
			else{
				$this->gestionAsignarPedido=new Asignar_Pedido($this->usuario, $fecha_pedido, $hora_pedido, $especialidad, $prioridad, $this->config,$otraSucursal);
				$this->empleados=$this->gestionAsignarPedido->get_lista_empleados();
			}
		}else {
		return false;
		}
	}
	
	
	//___CONFIRMAR NUEVO PEDIDO___
	public function  confirmarNuevoPedido($empleado_asignado, $detalles){ //es un entero, correspondiente a la posicion del empleado en la lista
		if (strlen($empleado_asignado) && strlen($detalles)<=250){
			$nro_nuevo_pedido=$this->gestionAsignarPedido->confirmar($empleado_asignado, $detalles);		
			if(is_numeric($nro_nuevo_pedido)) {
		        return $nro_nuevo_pedido;
		   	 } else {
		        return false;
		   	}
			unset($this->gestionAsignarPedido);
			$this->vaciarVariables();
		}else {
			return false;
		}
	}


//_____________________MODIFICAR PEDIDO_________________________________
	
	//___PRIMERA ETAPA DE MODIFICAR PEDIDO___
	//tipo_de_dato=[nro_pedido,/nro_usuario/dni_usuario]
	//hora puede ser null
	
	public function modificarPedido($id_busqueda, $tipo_de_dato, $fecha_pedido, $hora_pedido){
		if (strlen($id_busqueda) && strlen($tipo_de_dato)<=20 && strlen($hora_pedido)<=5 && strlen($fecha_pedido)<=10){
			$this->gestionModificarPedido=new Modificar_Pedido($id_busqueda, $tipo_de_dato, $fecha_pedido, $hora_pedido);  
			$this->pedido=$this->gestionModificarPedido->get_pedido();
			if(isset($this->pedido)){
				$this->usuario=$this->gestionModificarPedido->get_usuario();
				$this->empleado=$this->gestionModificarPedido->get_empleado();
			}
			return isset($this->pedido);
		}else {
			return false;
		}
		
	}
	
	//___COMENZAR MODIFICACION___
	//$otraSucursal: [0 si es esta sucursal, id_sucursal si es otra sucursal]
	public function set_cambios($nueva_fecha_pedido, $nueva_hora_pedido, $especialidad,$detalles, $prioridad, $otraSucursal){
		if (strlen($especialidad)<=20 && strlen($prioridad)<=10 && strlen($nueva_hora_pedido)<=5 && strlen($nueva_fecha_pedido)<=10){
			if($otraSucursal==$this->get_idsucursal()){
				$this->gestionModificarPedido->set_cambios($nueva_fecha_pedido, $nueva_hora_pedido, $especialidad,$prioridad,$detalles,$this->config,0);
				$this->empleados=$this->gestionModificarPedido->get_lista_empleados();
			}
			else{
				$this->gestionModificarPedido->set_cambios($nueva_fecha_pedido, $nueva_hora_pedido, $especialidad,$prioridad,$detalles,$this->config,0);
				$this->empleados=$this->gestionModificarPedido->get_lista_empleados();
			}
		}else {
			return false;
		}
	}
	
	//___CONFIRMAR MODIFICAR PEDIDO__
	public function confirmarModificarPedido($nuevo_empleado, $detalles_del_cambio){
		if (strlen($nuevo_empleado)&&strlen($detalles_del_cambio)<=250){
			$numero_nuevo=$this->gestionModificarPedido->confirmar($nuevo_empleado, $detalles_del_cambio);
			unset($this->gestionModificarPedido);
			$this->vaciarVariables();
			return $numero_nuevo;		
		}else{
			return false;
		}
	}


//_____________________ELIMINAR PEDIDO__________________________________
	
	//___PRIMERA ETAPA DE ELIMINAR PEDIDO___
	public function eliminarPedido($id_busqueda,$tipo_de_dato,$fecha_pedido,$hora_pedido){
		if(strlen($id_busqueda) && strlen($tipo_de_dato)<=20 && strlen($hora_pedido)<=5 && strlen($fecha_pedido)<=10){
			$this->gestionEliminarPedido=new Eliminar_Pedido($id_busqueda,$tipo_de_dato,$fecha_pedido,$hora_pedido);
			$this->pedido=$this->gestionEliminarPedido->get_pedido();
			if(isset($this->pedido)){
				$this->usuario=$this->gestionEliminarPedido->get_usuario();
				$this->empleado=$this->gestionEliminarPedido->get_empleado();
			}
			return isset($this->pedido);
		}else{
			return false;
		}
	}
	
	//___CONFIRMAR ELIMINAR PEDIDO__
	public function confirmarEliminarPedido($nuevo_detalle){
		if (strlen($nuevo_detalle)<=250){
			if ($this->pedido){
				$this->gestionEliminarPedido->confirmar($nuevo_detalle);
				unset($this->gestionEliminarPedido);
				$this->vaciarVariables();
				return true;
			}
			else{
				return false;
			}
		}else{
			return false;
		}
	}	


//_____________________GESTION DE USUARIOS_______________________________

	//_____________________CREAR_______________________
	public function agregarUsuario($nombre_usuario, $apellido_usuario, $fecha_nacimiento, $dni_usuario, $direccion_usuario){
		$this->gestionUsuario= new NuevoUsuario($nombre_usuario, $apellido_usuario, $fecha_nacimiento, $dni_usuario, $direccion_usuario);
		$nro_usuario_nuevo=$this->gestionUsuario->get_nro_usuario();
		unset($this->gestionUsuario);
		return $nro_usuario_nuevo;
	}

	public function agregarEmpleado($nombre_empleado, $apellido_empleado, $dni_empleado, $especialidad, $sucursal, $transporte, $direccion){
		$this->gestionEmpleado= new NuevoEmpleado($nombre_empleado, $apellido_empleado, $dni_empleado, $especialidad, $sucursal, $transporte, $direccion);
		$nro_empleado_nuevo=$this->gestionEmpleado->get_nro_empleado();
		unset($this->gestionEmpleado);
		return $nro_empleado_nuevo;
	}

	public function agregarUserPc($nombre_userPc, $apellido_userPc, $dni_userPc, $mail_userPc, $pass_userPc, $rol_userPc){
		$this->gestionUserPc= new NuevoUserPc($nombre_userPc, $apellido_userPc, $dni_userPc, $mail_userPc, $pass_userPc, $rol_userPc);
		$nro_userPc_nuevo=$this->gestionUserPc->get_nro_userPc();
		unset($this->gestionUserPc);
		return $nro_userPc_nuevo;
	}
	//_____________________MODIFICAR_______________________
	
		//___PRIMERA ETAPA DE MODIFICAR USUARIO___
	public function modificarUsuario($id_busqueda,$tipo_de_dato){
		$this->gestionUsuario=new Modificar_Usuario($id_busqueda, $tipo_de_dato);  //tipo_de_dato=[nro_usuario/dni_usuario]
		$this->usuario=$this->gestionUsuario->get_usuario();
		return isset($this->usuario);
	}
	
	//___SETEAR CAMBIOS USUARIO___
	public function set_cambios_usuario($nombre_usuario, $apellido_usuario, $fecha_nacimiento, $dni_usuario, $direccion_usuario){
		if(isset($this->usuario)){
			$this->gestionUsuario->set_cambios($nombre_usuario, $apellido_usuario, $fecha_nacimiento, $dni_usuario, $direccion_usuario);
			unset($this->gestionUsuario);
			$this->vaciarVariables();
			return true;	
		}
		else{
			return false;
		}
	}
	
		//___PRIMERA ETAPA DE MODIFICAR EMPLEADO___
	public function modificarEmpleado($id_busqueda,$tipo_de_dato){
		$this->gestionEmpleado=new Modificar_Empleado($id_busqueda, $tipo_de_dato);  //tipo_de_dato=[nro_empleado/dni_empleado]
		$this->empleado=$this->gestionEmpleado->get_empleado();
		return isset($this->empleado);
	}
	
	//___SETEAR CAMBIOS EMPLEADO___
	public function set_cambios_empleado($nombre_empleado, $apellido_empleado, $dni_empleado, $especialidad, $sucursal, $transporte, $direccion){
		if($this->empleado){
			$this->gestionEmpleado->set_cambios($nombre_empleado, $apellido_empleado, $dni_empleado, $especialidad, $sucursal, $transporte, $direccion);
			unset($this->gestionEmpleado);
			$this->vaciarVariables();
			return true;
		}
		else{
			return false;
		}
	}

		//___PRIMERA ETAPA DE MODIFICAR USERPC___
	public function modificarUserPc($id_busqueda, $tipo_de_dato){
		$this->gestionUserPc=new Modificar_UserPc($id_busqueda, $tipo_de_dato);  //tipo_de_dato=[nro_userPc/dni_userPc]
		$this->userPc=$this->gestionUserPc->get_userPc();
		return isset($this->userPc);
	}
	
	//___SETEAR CAMBIOS USERPC___
	public function set_cambios_userPc($nombre_userPc, $apellido_userPc, $dni_userPc, $mail_userPc, $pass_userPc,$rol_userPc){
		if($this->userPc){
			$this->gestionUserPc->set_cambios($nombre_userPc, $apellido_userPc, $dni_userPc, $mail_userPc, $pass_userPc,$rol_userPc);
			unset($this->gestionUserPc);
			$this->vaciarVariables();
			return true;
		}
		else{
			return false;
		}
	
	}
	
	//_____________________ELIMINAR_______________________


	//___PRIMERA ETAPA DE ELIMINAR USUARIO___
	public function eliminarUsuario($id_busqueda,$tipo_de_dato){ //tipo_de_dato=[nro_usuario/dni_usuario]
		$this->gestionUsuario=new EliminarUsuario($id_busqueda,$tipo_de_dato);
		$this->usuario=$this->gestionUsuario->get_usuario();
		return isset($this->usuario);
	}
	
	//___CONFIRMAR ELIMINAR USUARIO___
	public function confirmarEliminarUsuario(){
		if ($this->usuario){
			$this->gestionUsuario->confirmar();
			$this->vaciarVariables();
			unset($this->gestionUsuario);
			return true;
		}else{
			return false;
		}
	}
	
	//___PRIMERA ETAPA DE ELIMINAR EMPLEADO___
	public function eliminarEmpleado($id_busqueda,$tipo_de_dato){//tipo_de_dato=[nro_empleado/dni_empleado]
		$this->gestionEmpleado=new EliminarEmpleado($id_busqueda,$tipo_de_dato);
		$this->empleado=$this->gestionEmpleado->get_empleado();
		return isset($this->empleado);
	}
	
	//___CONFIRMAR ELIMINAR EMPLEADO___
	public function confirmarEliminarEmpleado(){
		if ($this->empleado){
			$this->gestionEmpleado->confirmar();
			$this->vaciarVariables();
			unset($this->gestionEmpleado);
			return true;
		}else{
			return false;
		}
	}
	
	//___PRIMERA ETAPA DE ELIMINAR UserPc___
	public function eliminarUserPc($id_busqueda,$tipo_de_dato){//tipo_de_dato=[dni_userPc/nro_userPc]
		$this->gestionUserPc=new EliminarUserPc($id_busqueda,$tipo_de_dato);
		$this->userPc=$this->gestionUserPc->get_userPc();
		return isset($this->userPc);
	}
	
	//___CONFIRMAR ELIMINAR UserPc___
	public function confirmarEliminarUserPc(){
		if ($this->userPc){
			$this->gestionUserPc->confirmar();
			$this->vaciarVariables();
			unset($this->gestionUserPc);
			return true;
		}else{
			return false;
		}
	}
	
	private function vaciarVariables(){
		unset($this->usuario);
		unset($this->empleado);
		unset($this->empleados);
		unset($this->fecha_pedido);
		unset($this->hora_pedido);
	}
	
//____________________SUCURSAL______________________

	//_____________________CREAR SUCURSAL__________________________
	public function agregarSucursal($nombre_sucursal, $direccion_sucursal, $radio_accion, $telefono_sucursal,$lista_especialidades){
		$this->gestionSucursal= new NuevaSucursal($nombre_sucursal, $direccion_sucursal, $radio_accion, $telefono_sucursal,$lista_especialidades);
		$nro_sucursal_nuevo=$this->gestionSucursal->get_nro_sucursal();
		unset($this->gestionSucursal);
		return $nro_sucursal_nuevo;
	}
	//_____________________MODIFICAR SUCURSAL_______________________
	
		//___PRIMERA ETAPA DE MODIFICAR SUCURSAL___
	public function modificarSucursal($id_busqueda,$tipo_de_dato){
		$this->gestionSucursal=new Modificar_Sucursal($id_busqueda, $tipo_de_dato);  //tipo_de_dato=[nro_usuario/dni_usuario]
		$this->sucursal=$this->gestionSucursal->get_sucursal();
		return isset($this->sucursal);
	}
	
	//___SETEAR CAMBIOS SUCURSAL______
	public function set_cambios_sucursal($nombre_sucursal, $direccion_sucursal, $radio_accion, $telefono_sucursal,$lista_especialidades){
		if(isset($this->sucursal)){
			$this->gestionSucursal->set_cambios($nombre_sucursal,$direccion_sucursal,$telefono_sucursal,$radio_accion,$lista_especialidades);
			unset($this->gestionSucursal);
			unset($this->sucursal);
			return true;	
		}
		else{
			return false;
		}
	}
	//_____________________ELIMINAR SUCURSAL_______________________
	
		//___PRIMERA ETAPA DE ELIMINAR SUCURSAL___
	public function eliminarSucursal($id_busqueda,$tipo_de_dato){//tipo_de_dato=[dni_userPc/nro_userPc]
		$this->gestionSucursal=new Eliminar_Sucursal($id_busqueda,$tipo_de_dato);
		$this->sucursal=$this->gestionSucursal->get_sucursal();
		return isset($this->sucursal);
	}
	
		//___CONFIRMAR ELIMINAR SUCURSAL___
	public function confirmarEliminarSucursal(){
		if ($this->sucursal){
			$this->gestionSucursal->confirmar();
			unset($this->sucursal);
			unset($this->gestionSucursal);
			return true;
		}else{
			return false;
		}
	}
	
	//____________________ANALISIS ESTADISTICOS______________________
	
	//es conveniente realizar primero la busqueda del empleado o sucursal que se quiere consultar, y luego
	//calcular la cantidad de pedidos realizados.
	public function calcular_pedidos($id_busqueda, $tipo_de_dato, $desde_fecha, $hasta_fecha){ // [id_sucursal-sucursa/nro_empleado-nro_empleado]
		$pedidos=new Calcular_Pedidos($id_busqueda, $tipo_de_dato, $desde_fecha, $hasta_fecha);
		if (isset($pedidos)){
			return sizeof($pedidos);
		}
		else{ 
			return false;
		}
	}
	
	public function pedidos_por_estado($estado, $desde_fecha){   //Estado [pendiente/finalizado/cancelado]
		$pedidos=new Pedidos_Por_Estado($estado, $desde_fecha);
		if (isset($pedidos)){
			return $pedidos;
		}
		else{ 
			return false;
		}
	}
		
	public function registro_de_logs($id_busqueda, $tipo_de_dato, $desde_fecha, $hasta_fecha){
		$logs=new Registro_De_Logs($id_busqueda, $tipo_de_dato, $desde_fecha, $hasta_fecha);
		if (isset($logs)){
			return $logs;
		}
		else{ 
			return false;
		}
	}
}

?>